#!/bin/bash
# Network Interface Configuration System
# Copyright (c) 1996-2009 Red Hat, Inc. all rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

unset WINDOW # defined by screen, conflicts with our usage

. /etc/init.d/functions

cd /etc/sysconfig/network-scripts
. ./network-functions

[ -f ../network ] && . ../network

CONFIG=${1}

[ -z "${CONFIG}" ] && {
    echo $"Usage: ifup <configuration>" >&2
    exit 1
}

need_config "${CONFIG}"

[ -f "${CONFIG}" ] || {
    echo $"$0: configuration for ${1} not found." >&2
    echo $"Usage: ifup <configuration>" >&2
    exit 1
}

if [ ${UID} != 0 ]; then
    if [ -x /usr/sbin/usernetctl ]; then
        source_config
        if /usr/sbin/usernetctl ${CONFIG} report ; then
            exec /usr/sbin/usernetctl ${CONFIG} up
        fi
    fi
    echo $"Users cannot control this device." >&2
    exit 1
fi

source_config

if ! is_true ${DEPRECATION_WARNING_ISSUED}; then
    net_log $"You are using 'ifup' script provided by 'network-scripts', which are now deprecated." warning ifup >&2
    net_log $"'network-scripts' will be removed from distribution in near future." warning ifup >&2
    net_log $"It is advised to switch to 'NetworkManager' instead - it provides 'ifup/ifdown' scripts as well." warning ifup >&2
fi

if [ "foo$2" = "fooboot" ] && is_false "${ONBOOT}"
then
    exit 0
fi
if [ -n "$IN_HOTPLUG" ] && is_false "${HOTPLUG}"
then
    exit 0
fi
if [ -n "$IN_HOTPLUG" -a "${TYPE}" = "Bridge" ]; 
then
    exit 0
fi

if is_true "$_use_nm" && [ -n "$UUID" ] && [ "$REALDEVICE" != "lo" ]; then
    if [ "foo$2" = "fooboot" ] && [ "${TYPE}" = "Wireless" ]; then
        exit 0
    fi
    [ -n "${DEVICE}" ] && is_nm_handling ${DEVICE} && exit 0
    nmcli con up uuid "$UUID"
    exit $?
fi

# Ethernet 802.1Q VLAN support
if is_true "${VLAN}" && is_false "$ISALIAS" && [ -n "$DEVICE" ]; then
    if [ -n "${VID}" ]; then
        if test -z "$PHYSDEV"; then
            net_log $"PHYSDEV should be set for device ${DEVICE}"
            exit 1
        fi
    else
        VID=""
        MATCH='^.+\.[0-9]{1,4}$'
        if [[ "${DEVICE}" =~ $MATCH ]]; then
            VID=$(echo "${DEVICE}" | LC_ALL=C sed 's/^.*\.\([0-9]\+\)/\1/')
            PHYSDEV=${DEVICE%.*}
        fi
        MATCH='^vlan[0-9]{1,4}?'
        if [[ "${DEVICE}" =~ $MATCH ]]; then
            VID=$(echo "${DEVICE}" | LC_ALL=C sed 's/^vlan0*//')
            # PHYSDEV should be set in ifcfg-vlan* file
            if test -z "$PHYSDEV"; then
                net_log $"PHYSDEV should be set for device ${DEVICE}"
                exit 1
            fi
        fi
    fi
    if [ -n "$VID" ]; then
        if [ ! -d /proc/net/vlan ]; then
            if ! modprobe 8021q >/dev/null 2>&1 ; then
                net_log $"No 802.1Q VLAN support available in kernel for device ${DEVICE}"
                exit 1
            fi
        fi

        is_available_wait ${PHYSDEV} ${DEVTIMEOUT} || {
            if [ "$?" = "1" ] ; then
                net_log $"$alias device ${DEVICE} does not seem to be present, delaying initialization."
                exit 1
            else
                exit 0
            fi
        }

        # Link on Physical device needs to be up but no ip required
        check_device_down ${PHYSDEV} && set_link_up ${PHYSDEV}

        if [ ! -f /proc/net/vlan/${DEVICE} ]; then
            if is_false "${REORDER_HDR}"; then
                FLAG_REORDER_HDR="reorder_hdr off"
            fi

            if is_true "${GVRP}"; then
                FLAG_GVRP="gvrp on"
            fi

            ip link add dev ${DEVICE} link ${PHYSDEV} type vlan id ${VID} ${FLAG_REORDER_HDR} ${FLAG_GVRP} || {
                net_log $"ERROR: could not add vlan ${VID} as ${DEVICE} on dev ${PHYSDEV}" info ifup 
                exit 1
            }

            [ -n "${VLAN_EGRESS_PRIORITY_MAP}" ] && ip link set dev ${DEVICE} type vlan egress ${VLAN_EGRESS_PRIORITY_MAP}
        fi
    fi

    /usr/lib/systemd/systemd-sysctl \
        --prefix "/proc/sys/net/ipv4/conf/${DEVICE}" \
        --prefix "/proc/sys/net/ipv6/conf/${DEVICE}"
fi

if [ "${BOOTPROTO}" = "bootp" -o "${BOOTPROTO}" = "dhcp" ]; then
    DYNCONFIG=true
fi

if [ -x /sbin/ifup-pre-local ]; then
    /sbin/ifup-pre-local ${CONFIG} $2
fi

OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${DEVICETYPE}"

if [ ! -x ${OTHERSCRIPT} ]; then
    OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${TYPE}"
fi

if [ ! -x ${OTHERSCRIPT} ]; then
    OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
fi

exec ${OTHERSCRIPT} ${CONFIG} $2
